package main

import (
	"errors"
	"fmt"
	"io/ioutil"
	"os"
)

func divide(a, b int) (int, error) {
	if b == 0 {
		// 返回自定义错误
		return 0, errors.New("除数不能为0")
	}
	return a / b, nil
}

func testPanicRecover() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("程序崩溃，恢复成功:", r)
		}
	}()

	panic("发生错误")
}

func main() {
	//result, err := divide(10, 0)
	//if err != nil {
	//	fmt.Println("错误:", err)
	//} else {
	//	fmt.Println("结果:", result)
	//}

	testPanicRecover()
}

// 错误类型
type error interface {
	Error() string
}

// 错误返回值
func someFunction() (int, error) {
	return 0, fmt.Errorf("something went wrong")
}

result, err := someFunction()
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}

// if语句查错
func example() {
	file, err := os.Open("nonexistent_file.txt")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return // 处理错误后，可能会退出函数或做其他错误处理
	}
	defer file.Close()

	// 进一步的操作
}

// 自定义错误类型
type MyError struct {
	Code    int
	Message string
}

func (e *MyError) Error() string {
	return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}

func doSomething() error {
	return &MyError{Code: 404, Message: "Not Found"}
}

func main() {
	err := doSomething()
	if err != nil {
		fmt.Println("Error:", err)
	}
}

// 多重错误检查
file, err := os.Open("file.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()

content, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("Error reading file:", err)
return
}

// panic / recoveru
func riskyFunction() {
	panic("Something went wrong!")
}

func main() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
		}
	}()

	riskyFunction() // 此调用将导致 panic 被 recover 捕获
}

// defer 用于资源清理
func readFile() (string, error) {
	file, err := os.Open("file.txt")
	if err != nil {
		return "", err
	}
	defer file.Close() // 确保文件在函数退出时关闭

	content, err := ioutil.ReadAll(file)
	if err != nil {
		return "", err
	}
	return string(content), nil
}